FastAPI এর Error Handling এবং Custom Exceptions

Web Development - ফাস্টএপিআই (FastAPI)
228

FastAPI একটি আধুনিক এবং শক্তিশালী Python ফ্রেমওয়ার্ক যা ডেভেলপারদের জন্য সহজ এবং কার্যকরী Error Handling প্রদান করে। এটি HTTP ত্রুটি কোড, কাস্টম এক্সসেপশন (Custom Exceptions) এবং কাস্টম ত্রুটি মেসেজ দিয়ে আরও ব্যবহারকারী-বান্ধব এবং নির্ভরযোগ্য API তৈরি করতে সহায়তা করে।

FastAPI তে Error Handling এবং Custom Exceptions ব্যবহারের মাধ্যমে আমরা অ্যাপ্লিকেশনকে আরও সুসংগঠিত এবং উন্নত করতে পারি। এখানে, আমরা দেখব কিভাবে FastAPI তে ত্রুটি পরিচালনা করা যায় এবং কাস্টম এক্সসেপশন তৈরি করা যায়।


Step 1: FastAPI তে Error Handling

FastAPI তে ত্রুটি হ্যান্ডলিং খুব সহজ, যেখানে আপনি HTTPException ব্যবহার করে কাস্টম ত্রুটি মেসেজ এবং HTTP স্ট্যাটাস কোড ফেরত পাঠাতে পারেন।

উদাহরণ: HTTPException ব্যবহার করা

from fastapi import FastAPI, HTTPException

app = FastAPI()

@app.get("/items/{item_id}")
def read_item(item_id: int):
    if item_id < 1:
        raise HTTPException(status_code=400, detail="Item ID must be greater than 0")
    return {"item_id": item_id}

এখানে:

  • HTTPException: এটি FastAPI তে ত্রুটি ফেরত পাঠানোর জন্য ব্যবহৃত হয়। এর মধ্যে status_code এবং detail প্যারামিটার ব্যবহার করে ত্রুটির কোড এবং বর্ণনা দেয়া হয়।
  • status_code=400: ক্লায়েন্টের ভুলের কারণে ত্রুটি, অর্থাৎ একটি খারাপ রিকোয়েস্ট।
  • detail="Item ID must be greater than 0": কাস্টম ত্রুটি বার্তা।

রিকোয়েস্ট উদাহরণ:

GET /items/0

রেসপন্স:

{
  "detail": "Item ID must be greater than 0"
}

Step 2: Built-in Error Handling

FastAPI তে কিছু built-in errors রয়েছে, যেমন:

  • 404 Not Found: যখন রিসোর্স পাওয়া যায় না।
  • 400 Bad Request: যখন রিকোয়েস্ট সঠিক নয়।
  • 422 Unprocessable Entity: যখন ইনপুট ডাটা ভ্যালিডেশন ব্যর্থ হয়।

এছাড়া, FastAPI অ্যাপ্লিকেশনটি ক্লায়েন্টের ভুল অথবা সার্ভারের সমস্যা অনুযায়ী প্রাসঙ্গিক HTTP স্ট্যাটাস কোডের মাধ্যমে ত্রুটি ফেরত দেয়।

উদাহরণ: Built-in Error (404)

@app.get("/items/{item_id}")
def read_item(item_id: int):
    items = {"1": "Item A", "2": "Item B"}
    if str(item_id) not in items:
        raise HTTPException(status_code=404, detail="Item not found")
    return {"item_id": item_id, "item_name": items[str(item_id)]}

এখানে, আমরা একটি আইটেমের জন্য ডাটা চেক করছি। যদি আইটেম না পাওয়া যায়, তবে 404 ত্রুটি ফেরত দিচ্ছি।

রিকোয়েস্ট উদাহরণ:

GET /items/3

রেসপন্স:

{
  "detail": "Item not found"
}

Step 3: Custom Exceptions (কাস্টম এক্সসেপশন তৈরি করা)

FastAPI তে আপনি Custom Exceptions তৈরি করতে পারেন, যা আপনাকে আরও নির্দিষ্ট ত্রুটি বার্তা এবং হ্যান্ডলিং প্রদান করতে সহায়তা করবে।

উদাহরণ: Custom Exception তৈরি করা

from fastapi import FastAPI, HTTPException

app = FastAPI()

class CustomException(Exception):
    def __init__(self, name: str):
        self.name = name

@app.get("/items/{item_id}")
def read_item(item_id: int):
    if item_id < 1:
        raise CustomException("Item ID cannot be less than 1")
    return {"item_id": item_id}

এখানে, আমরা CustomException তৈরি করেছি যা একটি name প্যারামিটার নেয় এবং যদি item_id ১ এর কম হয় তবে এটি ব্যবহার করা হবে।

Step 4: কাস্টম এক্সসেপশন হ্যান্ডলার

ফাস্টএপিআই তে কাস্টম এক্সসেপশন হ্যান্ডল করার জন্য আপনাকে exception_handler ডেকোরেটর ব্যবহার করতে হবে।

from fastapi import FastAPI, HTTPException
from fastapi.responses import JSONResponse

app = FastAPI()

class CustomException(Exception):
    def __init__(self, name: str):
        self.name = name

@app.exception_handler(CustomException)
async def custom_exception_handler(request, exc: CustomException):
    return JSONResponse(
        status_code=400,
        content={"message": f"Custom error: {exc.name} occurred"}
    )

@app.get("/items/{item_id}")
def read_item(item_id: int):
    if item_id < 1:
        raise CustomException("Item ID cannot be less than 1")
    return {"item_id": item_id}

এখানে, @app.exception_handler(CustomException) ব্যবহার করে আমরা আমাদের কাস্টম এক্সসেপশন CustomException হ্যান্ডল করেছি। যখন এই এক্সসেপশন ঘটবে, তখন একটি কাস্টম ত্রুটি বার্তা ফেরত যাবে।

রিকোয়েস্ট উদাহরণ:

GET /items/0

রেসপন্স:

{
  "message": "Custom error: Item ID cannot be less than 1 occurred"
}

Step 5: Custom Validation Error Handling

FastAPI তে ইনপুট ডাটা ভ্যালিডেশন ব্যর্থ হলে 422 Unprocessable Entity ত্রুটি স্বয়ংক্রিয়ভাবে ফেরত দেয়। তবে আপনি কাস্টম validation error handler তৈরি করতে পারেন যা ত্রুটির বার্তাকে আরও পরিষ্কারভাবে প্রদর্শন করবে।

উদাহরণ: কাস্টম ভ্যালিডেশন ত্রুটি হ্যান্ডলার

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, ValidationError
from fastapi.responses import JSONResponse

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float

@app.exception_handler(ValidationError)
async def validation_exception_handler(request, exc: ValidationError):
    return JSONResponse(
        status_code=422,
        content={"message": "Custom validation error", "errors": exc.errors()}
    )

@app.post("/items/")
async def create_item(item: Item):
    return item

এখানে:

  • ValidationError এর জন্য কাস্টম হ্যান্ডলার তৈরি করা হয়েছে।
  • exc.errors() এর মাধ্যমে ত্রুটির বিস্তারিত বার্তা বের করা হয়েছে।

রিকোয়েস্ট উদাহরণ:

{
  "name": "Laptop",
  "price": "invalid_price"
}

রেসপন্স:

{
  "message": "Custom validation error",
  "errors": [
    {
      "loc": ["body", "price"],
      "msg": "value is not a valid float",
      "type": "type_error.float"
    }
  ]
}

Step 6: অন্যান্য HTTP Exception

FastAPI তে আপনি অন্যান্য HTTP স্ট্যাটাস কোডের জন্যও Exception তৈরি করতে পারেন, যেমন:

  • 403 Forbidden: যখন অ্যাক্সেস অনুমতি নেই।
  • 401 Unauthorized: যখন ব্যবহারকারীর প্রমাণীকরণ ব্যর্থ হয়।

উদাহরণ: 403 Forbidden

from fastapi import FastAPI, HTTPException

app = FastAPI()

@app.get("/restricted-area/")
def restricted_area():
    raise HTTPException(status_code=403, detail="Access denied")

রিকোয়েস্ট উদাহরণ:

GET /restricted-area/

রেসপন্স:

{
  "detail": "Access denied"
}

FastAPI তে Error Handling এবং Custom Exceptions ব্যবহারের মাধ্যমে আপনি আরও শক্তিশালী এবং ব্যবহারকারী-বান্ধব API তৈরি করতে পারেন। HTTPException এবং CustomException এর মাধ্যমে আপনি কাস্টম ত্রুটি বার্তা এবং HTTP স্ট্যাটাস কোড কনফিগার করতে পারেন। কাস্টম এক্সসেপশন হ্যান্ডলার ব্যবহার করে আপনি ত্রুটির প্রসেসিং আরও পরিশীলিত এবং বিস্তারিত করতে পারেন।

Content added By

বিল্ট-ইন Error Handling ব্যবহার

176

FastAPI একটি অত্যন্ত শক্তিশালী এবং উন্নত ফ্রেমওয়ার্ক যা বিল্ট-ইন Error Handling সরবরাহ করে। এতে ব্যবহারকারী যখন কোনো ভুল ইনপুট দেয় বা কোনো ত্রুটি ঘটে, তখন ত্রুটির বিস্তারিত বার্তা এবং HTTP স্ট্যাটাস কোড সহ দ্রুত রেসপন্স প্রদান করা হয়। FastAPI তে বিভিন্ন ধরনের ত্রুটি (Error) এবং এর জন্য HTTPException ব্যবহার করে কাস্টম ত্রুটি তৈরি করা যায়।

এখানে, আমরা দেখব কিভাবে FastAPI তে বিল্ট-ইন Error Handling ব্যবহৃত হয় এবং কিভাবে কাস্টম ত্রুটি তৈরি করা যায়।


Step 1: বিল্ট-ইন Error Handling

FastAPI স্বয়ংক্রিয়ভাবে অনেক ত্রুটি (Error) হ্যান্ডেল করে, যেমন:

  • 404 (Not Found)
  • 400 (Bad Request)
  • 422 (Unprocessable Entity)

যখন রিকোয়েস্টের মধ্যে ভুল ডাটা বা ইনপুট থাকে, তখন FastAPI স্বয়ংক্রিয়ভাবে ত্রুটি তৈরি করে এবং ক্লায়েন্টকে সঠিক HTTP স্ট্যাটাস কোড সহ ত্রুটি বার্তা পাঠায়।

উদাহরণ: FastAPI তে বিল্ট-ইন ত্রুটি

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_id}")
async def read_item(item_id: int):
    if item_id == 1:
        return {"item_id": item_id}
    else:
        raise HTTPException(status_code=404, detail="Item not found")

এখানে:

  • যদি item_id 1 না হয়, তবে 404 Not Found ত্রুটি তৈরি হবে এবং Item not found বার্তা পাঠানো হবে।

রিকোয়েস্ট উদাহরণ:

GET /items/2

রেসপন্স (ত্রুটি):

{
  "detail": "Item not found"
}

Step 2: কাস্টম Error Handling

FastAPI তে HTTPException ক্লাস ব্যবহার করে আপনি কাস্টম ত্রুটি তৈরি করতে পারেন। এটি status_code এবং detail প্যারামিটার সহ ত্রুটি ফেরত দেয়।

উদাহরণ: কাস্টম Error Handling

from fastapi import FastAPI, HTTPException

app = FastAPI()

@app.get("/items/{item_id}")
async def read_item(item_id: int):
    if item_id == 10:
        raise HTTPException(status_code=400, detail="Bad Request: Invalid item ID")
    elif item_id == 20:
        raise HTTPException(status_code=404, detail="Item not found")
    return {"item_id": item_id}

এখানে:

  • যদি item_id 10 হয়, তবে 400 Bad Request ত্রুটি তৈরি হবে এবং Bad Request: Invalid item ID বার্তা পাঠানো হবে।
  • যদি item_id 20 হয়, তবে 404 Not Found ত্রুটি তৈরি হবে এবং Item not found বার্তা পাঠানো হবে।

রিকোয়েস্ট উদাহরণ:

GET /items/10

রেসপন্স (ত্রুটি):

{
  "detail": "Bad Request: Invalid item ID"
}

Step 3: কাস্টম Error Handling এবং Custom Exception

আপনি চাইলে কাস্টম Exception ক্লাস তৈরি করে তাতে কাস্টম ত্রুটি ফেরত দিতে পারেন।

উদাহরণ: কাস্টম Exception ক্লাস তৈরি করা

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI()

class ItemNotFoundException(Exception):
    def __init__(self, name: str):
        self.name = name

@app.exception_handler(ItemNotFoundException)
async def item_not_found_exception_handler(request, exc: ItemNotFoundException):
    return {"message": f"Item '{exc.name}' not found."}

@app.get("/items/{item_id}")
async def read_item(item_id: int):
    if item_id != 1:
        raise ItemNotFoundException(name=str(item_id))
    return {"item_id": item_id}

এখানে:

  • ItemNotFoundException একটি কাস্টম Exception ক্লাস, যা যখন রিকোয়েস্টের item_id 1 না হয়, তখন এই ত্রুটি তৈরি হবে।
  • item_not_found_exception_handler একটি কাস্টম exception handler, যা ত্রুটির মেসেজ কাস্টমাইজ করে।

রিকোয়েস্ট উদাহরণ:

GET /items/2

রেসপন্স (ত্রুটি):

{
  "message": "Item '2' not found."
}

Step 4: Validation Error Handling

FastAPI-তে Pydantic Models ব্যবহার করার সময় ইনপুট ভ্যালিডেশন ত্রুটি হতে পারে। FastAPI স্বয়ংক্রিয়ভাবে 422 Unprocessable Entity ত্রুটি ফেলে যদি ইনপুট ডাটা Pydantic Model এর সাথে মেলে না।

উদাহরণ: Validation Error Handling

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float

@app.post("/items/")
async def create_item(item: Item):
    if item.price < 0:
        raise HTTPException(status_code=400, detail="Price cannot be negative")
    return item

এখানে:

  • Item মডেলটি name এবং price এর জন্য ভ্যালিডেশন করে।
  • যদি price এর মান নেগেটিভ হয়, তবে 400 Bad Request ত্রুটি তৈরি হবে।

রিকোয়েস্ট উদাহরণ:

POST /items/

{
  "name": "Laptop",
  "price": -1500
}

রেসপন্স (ত্রুটি):

{
  "detail": "Price cannot be negative"
}

Step 5: HTTP Status Codes Customization

FastAPI-তে আপনি কাস্টম HTTP Status Code সহ ত্রুটি ফেরত দিতে পারেন, যেমন 401 Unauthorized, 403 Forbidden, 500 Internal Server Error ইত্যাদি।

উদাহরণ: কাস্টম HTTP Status Code ব্যবহার

from fastapi import FastAPI, HTTPException

app = FastAPI()

@app.get("/protected/")
async def protected_resource():
    raise HTTPException(status_code=401, detail="Unauthorized access")

এখানে 401 Unauthorized স্ট্যাটাস কোড ব্যবহার করা হয়েছে, যা শুধুমাত্র অনুমোদিত ব্যবহারকারীকে রিসোর্স অ্যাক্সেস করতে দেবে।

রিকোয়েস্ট উদাহরণ:

GET /protected/

রেসপন্স (ত্রুটি):

{
  "detail": "Unauthorized access"
}

FastAPI তে Error Handling সহজ, কার্যকরী এবং কাস্টমাইজযোগ্য। এটি HTTPException ব্যবহার করে কাস্টম ত্রুটি তৈরি করতে সহায়ক এবং আপনি status_code এবং detail প্যারামিটার ব্যবহার করে ত্রুটি বার্তা কাস্টমাইজ করতে পারেন। FastAPI তে ইনপুট ভ্যালিডেশন ত্রুটিগুলির জন্য স্বয়ংক্রিয়ভাবে 422 Unprocessable Entity ত্রুটি দেখানো হয় এবং আপনি চাইলে কাস্টম Exception তৈরি করে আরও নির্দিষ্ট ত্রুটি বার্তা এবং কোড কনফিগার করতে পারেন।

Content added By

Custom Exception তৈরি এবং হ্যান্ডল করা

170

FastAPI-তে Custom Exception তৈরি এবং হ্যান্ডল করা খুবই সহজ। FastAPI তে আপনি আপনার প্রয়োজন অনুযায়ী কাস্টম ত্রুটি (Exception) তৈরি করতে পারেন এবং সেগুলি বিভিন্ন API রাউট এবং এন্ডপয়েন্টে ব্যবহৃত করতে পারেন। কাস্টম এক্সসেপশন তৈরি করে আপনি একটি নির্দিষ্ট ত্রুটি বা স্টেটাস কোড ফেরত পাঠাতে পারেন, যা ব্যবহারকারী বা ডেভেলপারকে সঠিকভাবে নির্দেশনা দেয়।

এখানে, আমরা দেখব কিভাবে Custom Exception তৈরি করা যায় এবং FastAPI তে কিভাবে তা হ্যান্ডল করা যায়।


Step 1: Custom Exception তৈরি করা

FastAPI তে কাস্টম এক্সসেপশন তৈরি করতে আমরা সাধারণত HTTPException ক্লাস ইনহেরিট করি অথবা নতুন Exception ক্লাস তৈরি করি।

উদাহরণ: Custom HTTP Exception তৈরি

from fastapi import FastAPI, HTTPException
from starlette.status import HTTP_404_NOT_FOUND

app = FastAPI()

# Custom Exception class
class ItemNotFoundError(HTTPException):
    def __init__(self, item_id: int):
        self.item_id = item_id
        self.detail = f"Item with ID {item_id} not found"
        self.status_code = HTTP_404_NOT_FOUND

# একটি Route তৈরি যেখানে Custom Exception ব্যবহার করা হবে
@app.get("/items/{item_id}")
def read_item(item_id: int):
    # এখানে কিছু logic রয়েছে, যা নির্দিষ্ট আইটেম খুঁজে পাবে
    # যদি আইটেম না পাওয়া যায়, তাহলে Custom Exception raised হবে
    if item_id != 1:
        raise ItemNotFoundError(item_id)
    return {"item_id": item_id, "name": "Example Item"}

এখানে:

  • ItemNotFoundError একটি কাস্টম এক্সসেপশন যা HTTPException ক্লাস থেকে ইনহেরিট করা হয়েছে এবং একটি বিশেষ status_code এবং detail প্রদান করছে।
  • read_item ফাংশনে, যদি item_id ১ না হয়, তাহলে কাস্টম এক্সসেপশন ItemNotFoundError রেইজ করা হবে।

রিকোয়েস্ট উদাহরণ:

GET /items/2

রেসপন্স:

{
  "detail": "Item with ID 2 not found"
}

এখানে, যেহেতু item_id ১ এর সাথে মেলেনি, কাস্টম এক্সসেপশন ItemNotFoundError রেইজ করা হয়েছে।


Step 2: Custom Exception হ্যান্ডল করা

FastAPI তে কাস্টম এক্সসেপশন হ্যান্ডল করতে exception_handler ব্যবহার করা যায়। আপনি আপনার কাস্টম এক্সসেপশনের জন্য একটি কাস্টম হ্যান্ডলার তৈরি করতে পারেন, যা কাস্টম ত্রুটি বা অন্য কিছু স্টেটাস কোড ও ডিটেইল ফেরত পাঠাবে।

উদাহরণ: কাস্টম এক্সসেপশন হ্যান্ডলিং

from fastapi import FastAPI, HTTPException
from starlette.responses import JSONResponse
from starlette.status import HTTP_404_NOT_FOUND

app = FastAPI()

# Custom Exception class
class ItemNotFoundError(HTTPException):
    def __init__(self, item_id: int):
        self.item_id = item_id
        self.detail = f"Item with ID {item_id} not found"
        self.status_code = HTTP_404_NOT_FOUND

# কাস্টম এক্সসেপশন হ্যান্ডলার
@app.exception_handler(ItemNotFoundError)
async def item_not_found_exception_handler(request, exc: ItemNotFoundError):
    return JSONResponse(
        status_code=exc.status_code,
        content={"message": exc.detail}
    )

@app.get("/items/{item_id}")
def read_item(item_id: int):
    if item_id != 1:
        raise ItemNotFoundError(item_id)
    return {"item_id": item_id, "name": "Example Item"}

এখানে:

  • item_not_found_exception_handler: কাস্টম এক্সসেপশন ItemNotFoundError এর জন্য একটি কাস্টম এক্সসেপশন হ্যান্ডলার তৈরি করা হয়েছে।
  • JSONResponse: কাস্টম এক্সসেপশনের জন্য একটি JSON আউটপুট পাঠাচ্ছে, যাতে ত্রুটি সম্পর্কে বিস্তারিত বার্তা এবং সঠিক স্ট্যাটাস কোড ফেরত আসে।

রিকোয়েস্ট উদাহরণ:

GET /items/2

রেসপন্স:

{
  "message": "Item with ID 2 not found"
}

Step 3: General Exception Handling

FastAPI তে আপনি সাধারণ এক্সসেপশন হ্যান্ডলিংও করতে পারেন। যদি কোনো অপ্রত্যাশিত ত্রুটি ঘটে, তাহলে আপনি একটি general exception handler তৈরি করতে পারেন।

উদাহরণ: General Exception Handling

from fastapi import FastAPI, HTTPException
from starlette.responses import JSONResponse

app = FastAPI()

# General Exception Handler
@app.exception_handler(Exception)
async def general_exception_handler(request, exc: Exception):
    return JSONResponse(
        status_code=500,
        content={"message": f"Something went wrong: {exc}"}
    )

@app.get("/cause-error")
def cause_error():
    # এখানে একটি সাধারণ ত্রুটি সৃষ্টির জন্য '1/0' ডিভিশন জেনারেট করা হচ্ছে
    return 1 / 0

এখানে:

  • general_exception_handler: সমস্ত অপ্রত্যাশিত ত্রুটি ক্যাচ করার জন্য একটি হ্যান্ডলার তৈরি করা হয়েছে।
  • 1 / 0: একটি জেনুইন ডিভিশন বাই জিরো ত্রুটি তৈরি করার উদাহরণ।

রিকোয়েস্ট উদাহরণ:

GET /cause-error

রেসপন্স:

{
  "message": "Something went wrong: division by zero"
}

Step 4: Custom Error Responses

FastAPI তে আপনি কাস্টম ত্রুটি প্রতিক্রিয়া (error responses) তৈরি করতে পারেন যাতে সেগুলোর মধ্যে নির্দিষ্ট ফিল্ড থাকে, যেমন error_code, error_message, বা details

উদাহরণ: কাস্টম ত্রুটি প্রতিক্রিয়া

from fastapi import FastAPI, HTTPException
from starlette.responses import JSONResponse

app = FastAPI()

# Custom Exception with error_code and error_message
class CustomError(HTTPException):
    def __init__(self, error_code: int, error_message: str):
        self.error_code = error_code
        self.error_message = error_message
        self.status_code = 400

# Custom Error Handler
@app.exception_handler(CustomError)
async def custom_error_handler(request, exc: CustomError):
    return JSONResponse(
        status_code=exc.status_code,
        content={
            "error_code": exc.error_code,
            "error_message": exc.error_message
        }
    )

@app.get("/cause-custom-error")
def cause_custom_error():
    raise CustomError(error_code=1001, error_message="This is a custom error!")

রিকোয়েস্ট উদাহরণ:

GET /cause-custom-error

রেসপন্স:

{
  "error_code": 1001,
  "error_message": "This is a custom error!"
}

এখানে, CustomError ক্লাসটি কাস্টম ত্রুটি কোড এবং বার্তা ফিরিয়ে দেয় এবং custom_error_handler ফাংশন সেই ত্রুটি হ্যান্ডল করে।


FastAPI তে Custom Exception তৈরি এবং হ্যান্ডল করা খুবই সহজ এবং শক্তিশালী। আপনি সহজেই কাস্টম এক্সসেপশন তৈরি করতে পারেন এবং HTTPException ক্লাসের মাধ্যমে ত্রুটি মেসেজ এবং স্ট্যাটাস কোড কাস্টমাইজ করতে পারেন। এছাড়া, FastAPI তে সাধারণ এবং কাস্টম এক্সসেপশন হ্যান্ডলিং করা খুবই সহজ, যা আপনাকে উন্নত এবং সুরক্ষিত API তৈরি করতে সাহায্য করে।

Content added By

HTTPException এবং Response Status Code ম্যানেজমেন্ট

200

FastAPI তে HTTPException এবং Response Status Code ম্যানেজমেন্ট অত্যন্ত গুরুত্বপূর্ণ, কারণ এগুলোর মাধ্যমে আপনি API-র বিভিন্ন সাড়া (response) এবং ত্রুটি (error) হ্যান্ডলিং করতে পারেন। FastAPI তে HTTPException ব্যবহার করে কাস্টম ত্রুটি বার্তা প্রদান করা যায় এবং Response Status Code এর মাধ্যমে বিভিন্ন HTTP স্ট্যাটাস কোড সেট করা যায়।

এখানে আমরা দেখব কিভাবে FastAPI তে HTTPException ব্যবহার করে কাস্টম ত্রুটি বার্তা পাঠানো যায় এবং Response Status Code কাস্টমাইজ করা যায়।


HTTPException

FastAPI তে HTTPException ক্লাসটি ব্যবহার করে কাস্টম ত্রুটি (error) বার্তা এবং স্ট্যাটাস কোড পাঠানো যায়। এটি একটি বিশেষ ক্লাস যা HTTP স্ট্যাটাস কোড এবং ত্রুটি বার্তা প্রদান করতে সহায়ক।

উদাহরণ: HTTPException ব্যবহার

from fastapi import FastAPI, HTTPException

app = FastAPI()

@app.get("/items/{item_id}")
def read_item(item_id: int):
    if item_id != 42:
        raise HTTPException(status_code=404, detail="Item not found")
    return {"item_id": item_id, "name": "Item 42"}

এখানে:

  • HTTPException ক্লাসের মাধ্যমে 404 Not Found স্ট্যাটাস কোড এবং "Item not found" ত্রুটি বার্তা প্রদান করা হয়েছে যদি item_id 42 না হয়।

রিকোয়েস্ট উদাহরণ:

GET /items/100

রেসপন্স:

{
  "detail": "Item not found"
}

Response Status Code কাস্টমাইজেশন

FastAPI তে আপনি সহজেই রেসপন্স স্ট্যাটাস কোড কাস্টমাইজ করতে পারেন। এটি status_code প্যারামিটার ব্যবহার করে করা হয়। FastAPI ডিফল্টভাবে 200 OK রেসপন্স স্ট্যাটাস কোড প্রদান করে, তবে আপনি যেকোনো স্ট্যাটাস কোড সেট করতে পারেন।

উদাহরণ: Response Status Code কাস্টমাইজেশন

from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/custom_response_status/")
def custom_response_status():
    return JSONResponse(content={"message": "Created successfully!"}, status_code=201)

এখানে:

  • status_code=201 ব্যবহার করে কাস্টম রেসপন্স স্ট্যাটাস কোড 201 Created প্রদান করা হয়েছে।

রেসপন্স:

{
  "message": "Created successfully!"
}

HTTP Status Code: 201 (Created)


HTTPException সহ Custom Headers এবং Status Code

FastAPI তে HTTPException এর মাধ্যমে কাস্টম হেডার এবং স্ট্যাটাস কোড সহ ত্রুটি বার্তা পাঠানো যায়। নিচে কিভাবে কাস্টম হেডারসহ ত্রুটি পাঠানো যায় তা দেখানো হয়েছে।

উদাহরণ: HTTPException সহ Custom Headers

from fastapi import FastAPI, HTTPException

app = FastAPI()

@app.get("/error_with_header/")
def error_with_header():
    raise HTTPException(
        status_code=403,
        detail="Access forbidden",
        headers={"X-Error": "There goes my error"}
    )

এখানে:

  • headers প্যারামিটার ব্যবহার করে কাস্টম হেডার X-Error পাঠানো হয়েছে।

রেসপন্স:

{
  "detail": "Access forbidden"
}

HTTP Status Code: 403 (Forbidden)

Headers:

X-Error: There goes my error

Validating Query Parameters with HTTPException

আপনি যদি Query Parameters এর মাধ্যমে ইনপুট গ্রহণ করেন এবং সেগুলোর ভ্যালিডেশন করতে চান, তবে HTTPException ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনি যদি একটি limit প্যারামিটার গ্রহণ করেন এবং সেটির মান সঠিক না হয়, তাহলে ত্রুটি ফিরিয়ে দিতে পারেন।

উদাহরণ: Query Parameter Validation

from fastapi import FastAPI, HTTPException

app = FastAPI()

@app.get("/items/")
def get_items(limit: int = 10):
    if limit > 100:
        raise HTTPException(status_code=400, detail="Limit exceeds maximum allowed value of 100")
    return {"limit": limit}

এখানে:

  • limit প্যারামিটার যদি 100 এর বেশি হয়, তবে 400 Bad Request রেসপন্স কোড সহ কাস্টম ত্রুটি বার্তা প্রদান করা হবে।

রিকোয়েস্ট উদাহরণ:

GET /items/?limit=200

রেসপন্স:

{
  "detail": "Limit exceeds maximum allowed value of 100"
}

HTTPException with Validation Error for Request Body

FastAPI তে আপনি Request Body (যেমন JSON) ভ্যালিডেশন করতে Pydantic Model ব্যবহার করেন। যদি ইনপুট ডাটা ভুল হয়, FastAPI স্বয়ংক্রিয়ভাবে একটি ত্রুটি প্রদান করবে।

উদাহরণ: Request Body Validation Error

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    price: float

app = FastAPI()

@app.post("/create-item/")
def create_item(item: Item):
    if item.price < 0:
        raise HTTPException(status_code=400, detail="Price must be greater than or equal to 0")
    return {"item_name": item.name, "item_price": item.price}

এখানে:

  • Item মডেলের price ফিল্ডের জন্য price >= 0 ভ্যালিডেশন করা হয়েছে।
  • যদি price ঋণাত্মক মান (negative value) হয়, তবে 400 Bad Request ত্রুটি ফেরত পাঠানো হবে।

রিকোয়েস্ট উদাহরণ:

{
  "name": "Laptop",
  "price": -500
}

রেসপন্স:

{
  "detail": "Price must be greater than or equal to 0"
}

FastAPI তে HTTPException এবং Response Status Code ব্যবস্থাপনা খুবই সহজ এবং শক্তিশালী। HTTPException ক্লাস ব্যবহার করে আপনি কাস্টম ত্রুটি বার্তা এবং HTTP স্ট্যাটাস কোড দিতে পারেন, যা API-র রেসপন্স হ্যান্ডলিংয়ের জন্য খুবই কার্যকর। Response Status Code কাস্টমাইজ করার মাধ্যমে আপনি রেসপন্সের মান সঠিকভাবে সেট করতে পারবেন এবং এর মাধ্যমে API-র ব্যবহারকারীদের জন্য আরও নির্দিষ্ট এবং সঠিক ত্রুটি বার্তা প্রদান করা সম্ভব হবে।

Content added By

Global Exception Handler কনফিগার করা

198

FastAPI তে Global Exception Handler ব্যবহার করে আপনি অ্যাপ্লিকেশনের সকল ধরনের ত্রুটি বা এক্সসেপশন এককভাবে হ্যান্ডেল করতে পারেন। এর মাধ্যমে আপনি কাস্টম ত্রুটি বার্তা, স্ট্যাটাস কোড এবং লগিং সুবিধা যোগ করতে পারেন, যা অ্যাপ্লিকেশনকে আরও মজবুত এবং ব্যবস্থাপনাযোগ্য করে তোলে।

এখানে আমরা দেখব কিভাবে FastAPI তে Global Exception Handler কনফিগার করা যায় এবং কাস্টম ত্রুটি বার্তা ও স্ট্যাটাস কোড পরিচালনা করা যায়।


Step 1: FastAPI তে Default Exception Handling

FastAPI স্বয়ংক্রিয়ভাবে কিছু সাধারণ এক্সসেপশন যেমন 404 Not Found এবং 422 Unprocessable Entity এর জন্য ডিফল্ট এক্সসেপশন হ্যান্ডলিং প্রদান করে।

যতটা সহজ FastAPI এ Exception হ্যান্ডলিং করা যায়, ততটাই গুরুত্বপূর্ণ যদি আপনি একটি কাস্টম এক্সসেপশন মেসেজ বা অন্যান্য নির্দিষ্ট আচরণ তৈরি করতে চান।


Step 2: Global Exception Handler তৈরি করা

FastAPI তে Global Exception Handler তৈরি করতে আমরা exception_handler ডেকোরেটর ব্যবহার করি। এটি অ্যাপ্লিকেশন স্তরে সমস্ত এক্সসেপশনকে কাস্টমাইজ করে হ্যান্ডল করতে সাহায্য করে।

উদাহরণ: Custom Exception Handler

from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import JSONResponse
from starlette.exceptions import HTTPException as StarletteHTTPException

app = FastAPI()

# Global Exception Handler for HTTPException
@app.exception_handler(StarletteHTTPException)
async def http_exception_handler(request: Request, exc: StarletteHTTPException):
    return JSONResponse(
        status_code=exc.status_code,
        content={"message": f"Custom Error: {exc.detail}"},
    )

@app.get("/items/{item_id}")
async def get_item(item_id: int):
    if item_id > 10:
        raise HTTPException(status_code=404, detail="Item not found")
    return {"item_id": item_id}

এখানে:

  • http_exception_handler: FastAPI তে HTTPException এর জন্য কাস্টম এক্সসেপশন হ্যান্ডলার। এটি HTTPException ত্রুটির জন্য কাস্টম মেসেজ এবং স্ট্যাটাস কোড প্রদান করে।
  • raise HTTPException(status_code=404, detail="Item not found"): এটি একটি সাধারণ HTTPException যা 404 স্ট্যাটাস কোড সহ একটি ত্রুটি তৈরি করবে।

রেসপন্স (যদি item_id > 10):

{
  "message": "Custom Error: Item not found"
}

এখানে, যদি item_id 10 এর বেশি হয়, তবেই কাস্টম ত্রুটি বার্তা ফেরত আসবে।


Step 3: Custom Exception তৈরি এবং হ্যান্ডলিং

ফাস্টএপিআইতে আপনি আপনার কাস্টম এক্সসেপশন তৈরি করতে পারেন এবং সেই এক্সসেপশনকে হ্যান্ডল করতে একটি কাস্টম হ্যান্ডলার সেট করতে পারেন।

উদাহরণ: Custom Exception

from fastapi import FastAPI, HTTPException
from fastapi.responses import JSONResponse

app = FastAPI()

class CustomException(Exception):
    def __init__(self, name: str):
        self.name = name

@app.exception_handler(CustomException)
async def custom_exception_handler(request, exc: CustomException):
    return JSONResponse(
        status_code=418,
        content={"message": f"Custom Error: {exc.name}"},
    )

@app.get("/raise_custom_error/{name}")
async def raise_custom_error(name: str):
    if name == "error":
        raise CustomException(name="Something went wrong with the custom error")
    return {"message": "No error"}

এখানে:

  • CustomException: এটি একটি কাস্টম এক্সসেপশন ক্লাস, যা আপনি যেকোনো ত্রুটি বা সমস্যা হ্যান্ডল করতে তৈরি করতে পারেন।
  • custom_exception_handler: এটি কাস্টম এক্সসেপশন হ্যান্ডলার, যা 418 I'm a teapot স্ট্যাটাস কোড সহ কাস্টম ত্রুটি বার্তা প্রদান করে।

রিকোয়েস্ট উদাহরণ:

GET /raise_custom_error/error
রেসপন্স:

{
  "message": "Custom Error: Something went wrong with the custom error"
}

Step 4: Global Exception Handler for All Exceptions

আপনি যদি সব ধরনের এক্সসেপশনকে হ্যান্ডল করতে চান (যেমন HTTPException, ValueError, TypeError, ইত্যাদি), তবে আপনি একটি সাধারণ কাস্টম এক্সসেপশন হ্যান্ডলার তৈরি করতে পারেন।

উদাহরণ: All Exception Handler

from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import logging

app = FastAPI()

# Global Exception Handler for All Exceptions
@app.exception_handler(Exception)
async def general_exception_handler(request: Request, exc: Exception):
    logging.error(f"An unexpected error occurred: {exc}")
    return JSONResponse(
        status_code=500,
        content={"message": "An unexpected error occurred. Please try again later."},
    )

@app.get("/cause_error/")
async def cause_error():
    raise ValueError("This is a value error")

এখানে:

  • @app.exception_handler(Exception): এই হ্যান্ডলারটি সকল এক্সসেপশনকে হ্যান্ডল করবে।
  • logging.error: ত্রুটির লগ সংরক্ষণ করতে ব্যবহার করা হয়েছে, যাতে আপনি ডিবাগ করতে পারেন।

রিকোয়েস্ট উদাহরণ (যদি ValueError ত্রুটি ঘটেছে):

GET /cause_error/
রেসপন্স:

{
  "message": "An unexpected error occurred. Please try again later."
}

এখানে, ValueError ত্রুটি ঘটে, এবং কাস্টম 500 Internal Server Error বার্তা প্রদান করা হয়।


Step 5: Custom Response for Validation Errors

FastAPI তে validation errors জন্যও কাস্টম এক্সসেপশন হ্যান্ডলার তৈরি করা সম্ভব। FastAPI স্বয়ংক্রিয়ভাবে 422 Unprocessable Entity ত্রুটি ফেলে যদি ইনপুট ডাটা ভুল হয়। আপনি এটি কাস্টমাইজ করতে পারেন।

উদাহরণ: Validation Error Handler

from fastapi import FastAPI, HTTPException
from fastapi.responses import JSONResponse
from pydantic import BaseModel, validator

app = FastAPI()

# Request Body Model
class Item(BaseModel):
    name: str
    price: float

    @validator("name")
    def name_must_contain_space(cls, v):
        if " " not in v:
            raise ValueError("Name must contain a space")
        return v

@app.exception_handler(ValueError)
async def validation_exception_handler(request, exc: ValueError):
    return JSONResponse(
        status_code=422,
        content={"message": f"Validation Error: {exc.args[0]}"}
    )

@app.post("/items/")
async def create_item(item: Item):
    return {"message": "Item created successfully"}

এখানে, আমরা name_must_contain_space ভ্যালিডেটর দিয়ে name ফিল্ডের জন্য একটি কাস্টম ভ্যালিডেশন যোগ করেছি। যদি নামের মধ্যে স্পেস না থাকে, তবে একটি ValueError ত্রুটি হবে।

রিকোয়েস্ট উদাহরণ:

{
  "name": "Laptop",
  "price": 1500.00
}

রেসপন্স (যদি Validation Fail হয়):

{
  "message": "Validation Error: Name must contain a space"
}

FastAPI তে Global Exception Handler ব্যবহার করে আপনি অ্যাপ্লিকেশনের সব ধরনের ত্রুটির জন্য কাস্টম হ্যান্ডলার তৈরি করতে পারেন। কাস্টম ত্রুটি বার্তা, স্ট্যাটাস কোড, এবং লগিং সুবিধা যোগ করে অ্যাপ্লিকেশনটি আরও মজবুত এবং ব্যবস্থাপনাযোগ্য করা যায়। এছাড়া আপনি কাস্টম এক্সসেপশন এবং ভ্যালিডেশন ত্রুটিগুলি হ্যান্ডল করার জন্য শক্তিশালী কাস্টমাইজেশন করতে পারেন।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...